package ch05;

/**
 * 改进模式十二，使用访问者，与原来的节点类定义完全隔离开来。
 * 比如，可以将AddNode和IntNode的walk()方法，以及负责调度它们的方法合并在一个类中
 */

// 彻底封装并独立的节点访问者
public class IndependentPostOrderPrintVisitor {
    /** 调度方法，根据参数类型调用其他方法 **/
    /** 实际上，为了防止一大堆树节点的类型，导致存在一大串if-then-else而降低效率，最好应该用switch-case实现 **/
    public void print(ExprNode n) {
        if (n.getClass() == AddNode.class) {
            print((AddNode) n);
        } else if (n.getClass() == IntNode.class) {
            print((IntNode) n);
        } else {
            System.out.println("错误，不支持这种节点类型");
        }
    }

    public void print(AddNode n) {
        print(n.left);
        print(n.right);
        System.out.println(n.token);
    }

    public void print(IntNode n) {
        System.out.println(n.token);
    }
}
